<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Qusetions</title>
</head>
<body>
    
    <script>
        // function Person(name , age , sex){
        //     this.name = name;
        //     this.age = age;
        //     this.sex = sex;
        //     this.say = say;
        //     var a = 0;
        //     function say(){
        //         a ++;
        //         console.log(a);
        //     }           
        // }
        // var person = new Person();
        // person.say();
        // person.say();
        // var person1 = new Person();
        // person1.say();
        
        
        
            // function Person(){
            //     this.num = 100;
            // }
            // function Person1(){
                
            // }

            // var person = new Person();
            // // person = {num:100};
            // Person1.prototype = person;
            
            // var person1 = new Person1();
            // // person1 = {
            // //    __proto__:person;
            // // }
            // console.log(person1.num);//100

            // person1.num ++;//其实就是增加属性而已

            // console.log(person1.num);//101
            // console.log(person.num);//100



            // var obj = Object.create({name:'abc'});

            // function Person(name,age,sex){
            //     this.name = name;
            //     this.age = age;
            //     this.sex = sex;
            // }
            // function Student(name,age,sex,tel,grade){
            //     Person.call(this,name,age,sex);
            //     this.tel = tel;
            //     this.grade = grade;
            // }

            

            
                    
            // person.__proto__ = Person.prototype
            //1：创建对象的时候，里面有个__proto__属性，里面指向该创建对象的构造函数的prototype

            //2：构造器里面有一个prototype属性。他是一个对象，他是 该构造函数 构造 出对象的原型。

            //3：创建构造器的时候，里面隐式的创建了一个prototype属性，该属性是一个对象，对象里面有一个constructor属性指向该构造器。

                
           //创建了一个构造器的时候，创建了一个prototype属性指向一个对象，该对象里面有一个constructor 值为 该构造器
           //通过该构造器创建对象的时候，隐式创建了一个 __proto__属性指向通过prototype属性指向的同一个对象，该对象有一个construct 值为 该构造器
           //构造器的prototype，也就是创建对象的__proto__;




            //实现一个继承
            //1:新建一个空构造函数，将父构造函数的原型指向该空构造函数的原型； F.prototype = Origin.prototype;
            //2:子构造函数的原型，指向空构造函数的new对象。
            //3:将子构造函数的原型的constructor 指向子构造函数。

            // eq1
        //    function inherit(Target, Origin){        
        //         var F = function(){};
        //         F.prototype = Origin.prototype;
        //         Target.prototype = new F();
        //         Target.prototype.constructor = Target;
        //     }
        //      // eq2
        // var inherit = (function(){
        //     var F = function(){};//私有变量 外部访问不了
        //     return function(Target, Origin){
        //         F.prototype = Origin.prototype;
        //         Target.prototype = new F();
        //         Target.prototype.constructor = Target;
        //         Target.prototype.uber = Origin.prototype;
        //     }
        // }());
            
            var inherit = (function(){
                var F = function(){};
                return function(Target, Origin){
                    F.prototype = Origin.prototype;//1，新F的原型指向原始构造函数的原型
                    Target.prototype = new F();//2，目标构造函数的原型指向新F创建的空对象
                    Target.prototype.constructor = Target;//3，目标构造函数的原型上面的constructor方法指向目标构造函数
                    Target.prototype.uber = Origin.prototype;//4，设置目标构造函数的uber
                }
            }())
            

            function Person(){}               
            function Student(){}          
            inherit(Student,Person);
    </script>
</body>
</html>

